package conservare.web;

import java.io.IOException;
import java.io.Serializable;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.faces.bean.ManagedBean;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

import conservare.boleto.LeitorDeArquivoRetorno;
import conservare.boleto.LeitorDeArquivoRetornoCEF240;
import conservare.boleto.PagadorDoBoleto;
import conservare.boleto.service.ArquivoRetornoService;
import conservare.boleto.service.IdentificaQuemPagouBoleto;
import conservare.constantes.Constante;
import conservare.modelo.boleto.ArquivoRetorno;
import conservare.modelo.boleto.ArquivoRetornoDetalhe;
import conservare.modelo.boleto.BoletoEmitido;
import conservare.negocio.BoletoEmitidoRN;
import conservare.negocio.BoletoRetornoRN;

@ManagedBean
@javax.faces.bean.ViewScoped
public class BoletoRetornoBean implements Serializable {

	private static final long serialVersionUID = 3844494979587033693L;

	private List<ArquivoRetornoUpload> arquivosRetornoUploads = new ArrayList<>();
	private ArquivoRetorno arquivoRetorno;
	private boolean isListaOrdenada = false;
	List<PagadorDoBoleto> identificaQuemFezPagamentos = new ArrayList<>();
	
	
	public void handleFileUpload(FileUploadEvent event) {  
		
		UploadedFile uploadFile = event.getFile();
		
		LeitorDeArquivoRetorno leitorDeArquivoRetorno = new LeitorDeArquivoRetornoCEF240();
		
		 try {
			leitorDeArquivoRetorno.defineConteudoArquivoRetorno(uploadFile.getInputstream());
			this.arquivoRetorno = new ArquivoRetornoService(leitorDeArquivoRetorno).importarArquivoRetorno();
			IdentificaQuemPagouBoleto identificaQuemPagouBoleto = new IdentificaQuemPagouBoleto(this.arquivoRetorno);
			
			this.identificaQuemFezPagamentos = identificaQuemPagouBoleto.obterListaPagadores();
			
		} catch (IOException e1) {
			e1.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
/*		
		
		try {
			this.arquivosRetornoUploads.add(new ArquivoRetornoUpload(event.getFile()));
			this.isListaOrdenada = false;
		} catch (IOException e) {
			e.printStackTrace();
		}*/
        
    }


	public List<ArquivoRetornoUpload> getArquivosRetornoUploads() {
		
		if(!isListaOrdenada){
			Collections.sort(arquivosRetornoUploads);
			isListaOrdenada = true;
		}
		return arquivosRetornoUploads;
	}

	
    
    
	public ArquivoRetorno getArquivoRetorno() {
		return arquivoRetorno;
	}

	

	public List<PagadorDoBoleto> getIdentificaQuemFezPagamentos() {
		return identificaQuemFezPagamentos;
	}


/*	private List<PagadorDoBoleto> identificaQuemFezPagamento(final ArquivoRetorno arquivoRetorno){
		List<PagadorDoBoleto> identificaPagamentos = new ArrayList<>();
		for(ArquivoRetornoDetalhe pagamento : arquivoRetorno.getDetalhesPagamento()){
			
			BoletoEmitido boletoEmitido = new BoletoEmitidoRN().obterBoletoPeloNossoNumero(Constante.CONSERVARE_NUMERO_BANCO_CEF, pagamento.getNossoNumero());
			PagadorDoBoleto quemPagou = null;
			if(boletoEmitido != null){
				quemPagou = new PagadorDoBoleto(boletoEmitido.getNomeDoSacado(), boletoEmitido.getNomeDoSacadorAvalista(), pagamento.getDataVencimentoDoTitulo(), pagamento.getDataPagamentoDoTitulo(), pagamento.getValorPago());
			}else{
				quemPagou = new PagadorDoBoleto("", "", pagamento.getDataVencimentoDoTitulo(), pagamento.getDataPagamentoDoTitulo(), pagamento.getValorPago());
			}
			identificaPagamentos.add(quemPagou);
			
		}
	
		
		return identificaPagamentos;
	}*/


	//Inner Class
	public class ArquivoRetornoUpload implements Serializable, Comparable<ArquivoRetornoUpload>{

		private static final long serialVersionUID = 1782623143397901612L;
		
		private Integer sequencial;
		private UploadedFile uploadFile;
		private String nomeArquivo;
		private String numeroDoBanco;
		private boolean arquivoValido = false;
		private String resultadoProcessamentoDeBaixa = " ";
		LeitorDeArquivoRetorno leitorDeArquivoRetorno;
		ArquivoRetorno arquivoRetorno;
		
		public ArquivoRetornoUpload(UploadedFile uploadFile) throws IOException{
			
			
			this.uploadFile = uploadFile;
			this.nomeArquivo = uploadFile.getFileName();
			this.arquivoValido = true;
			
			leitorDeArquivoRetorno = new LeitorDeArquivoRetornoCEF240();
			
			leitorDeArquivoRetorno.defineConteudoArquivoRetorno(uploadFile.getInputstream());
			this.sequencial = leitorDeArquivoRetorno.getHeaderNumeroSequencialRetorno();
			this.numeroDoBanco = leitorDeArquivoRetorno.getHeaderNumeroDoBanco();
			try {
				this.arquivoRetorno = new ArquivoRetornoService(leitorDeArquivoRetorno).importarArquivoRetorno();
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}

		
		public Integer getSequencial() {
			return sequencial;
		}

		public UploadedFile getUploadFile() {
			return uploadFile;
		}

		public void setUploadFile(UploadedFile uploadFile) {
			this.uploadFile = uploadFile;
		}

		public String getNumeroDoBanco() {
			return numeroDoBanco;
		}

		
		public String getNomeArquivo() {
			return nomeArquivo;
		}

		
		public ArquivoRetorno getArquivoRetorno() {
			return arquivoRetorno;
		}


		public String getResultadoProcessamentoDeBaixa() {
			return resultadoProcessamentoDeBaixa;
		}


		public boolean isArquivoValido() {
			return arquivoValido;
		}

		public String doExecutarBaixa(){
			try {
				new BoletoRetornoRN().executarBaixaArquivoRetorno(this.leitorDeArquivoRetorno);
			} catch (ParseException e) {
				e.printStackTrace();
			}
			this.resultadoProcessamentoDeBaixa = "Baixa executada com sucesso !";
			return null;
		}

		

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result
					+ ((sequencial == null) ? 0 : sequencial.hashCode());
			return result;
		}


		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			ArquivoRetornoUpload other = (ArquivoRetornoUpload) obj;
			if (sequencial == null) {
				if (other.sequencial != null)
					return false;
			} else if (!sequencial.equals(other.sequencial))
				return false;
			return true;
		}


		@Override
		public int compareTo(ArquivoRetornoUpload o) {
			return this.sequencial.compareTo(o.getSequencial());
		}
		
	}
	
	
	
	/*
	public class PagadorDoBoleto implements Serializable{
		
		private static final long serialVersionUID = -3488860611674068885L;
		
		private String nomeSacado = "";
		private String nomeSacadoAvalista = "";
		private Date dataVencimento;
		private Date dataPagamento;
		private BigDecimal valorPago = BigDecimal.ZERO;
		
		public PagadorDoBoleto() {
			super();
		}
		
		public PagadorDoBoleto(String nomeSacado, String nomeSacadoAvalista, Date dataVencimento, Date dataPagamento, BigDecimal valorPago) {
			super();
			this.nomeSacado = nomeSacado;
			this.nomeSacadoAvalista = nomeSacadoAvalista;
			this.dataVencimento = dataVencimento;
			this.dataPagamento = dataPagamento;
			this.valorPago = valorPago;
		}
		
		
		public boolean isPagamentoSemAtraso(){
			if(getDataPagamento() != null && getDataVencimento() != null){
				return getDataPagamento().after(getDataVencimento()) ? false : true;
			}
			
			return true;
		}
		
		public String getNomeSacado() {
			return nomeSacado;
		}
		
		public String getNomeSacadoAvalista() {
			return nomeSacadoAvalista;
		}
		
		public Date getDataPagamento() {
			return dataPagamento;
		}
		
		public Date getDataVencimento() {
			return dataVencimento;
		}

		public BigDecimal getValorPago() {
			return valorPago;
		}
		
		
		
	}*/
	
	
}
